package com.isczy.acl.controller;


import cn.hutool.core.util.ArrayUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.digest.MD5;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.api.R;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.isczy.acl.entity.User;
import com.isczy.acl.service.RoleService;
import com.isczy.acl.service.UserService;
import com.isczy.servicebase.exceptionHandler.MyException;
import com.isczy.utils.DataResult;
import com.isczy.utils.ResultCode;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 用户表 前端控制器
 * </p>
 *
 */
@RestController
@RequestMapping("/admin/acl/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;

    /***
     * ***************************************
     * 功能描述:获取管理用户分页列表
     * @param page
     * @param limit
     * @param userQueryVo
     * @return {@link DataResult}
     * @author create: TODO 人员:【ChangZiYang】类型:【新增方法】日期:【2021-01-26 14:39】
     * @author modify:
     */

    @PreAuthorize("hasAuthority('user.list')")
    @ApiOperation(value = "获取管理用户分页列表")
    @GetMapping("{page}/{limit}")
    public DataResult index(
            @ApiParam(name = "page", value = "当前页码", required = true)
            @PathVariable Long page,
            @ApiParam(name = "limit", value = "每页记录数", required = true)
            @PathVariable Long limit,
            @ApiParam(name = "courseQuery", value = "查询对象", required = false)
                    User userQueryVo) {
        try{
            Page<User> pageParam = new Page<>(page, limit);
            QueryWrapper<User> wrapper = new QueryWrapper<>();
            if(!StringUtils.isEmpty(userQueryVo.getUsername())) {
                wrapper.like("username",userQueryVo.getUsername());
            }
            IPage<User> pageModel = userService.page(pageParam, wrapper);
            return DataResult.builder()
                    .data("items", pageModel.getRecords())
                    .data("total", pageModel.getTotal())
                    .successBuild();
        }catch (Exception e){
            throw MyException.builder()
                    .exception(e)
                    .code(ResultCode.ERROR)
                    .className(getClass().getName())
                    .methodName(Thread.currentThread().getStackTrace()[1].getMethodName())
                    .message("获取角色分页列表失败")
                    .params(userQueryVo)
                    .build();
        }
    }

    /***
     * ***************************************
     * 功能描述:新增管理用户
     * @param user
     * @return {@link DataResult}
     * @author create: TODO 人员:【ChangZiYang】类型:【新增方法】日期:【2021-01-26 14:41】
     * @author modify:
     */
    @ApiOperation(value = "新增管理用户")
    @PostMapping("save")
    public DataResult save(@RequestBody User user) {
        try{
            user.setPassword(SecureUtil.md5(user.getPassword()));
            userService.save(user);
            return DataResult.builder().successBuild();
        }catch (Exception e){
            throw MyException.builder()
                    .exception(e)
                    .code(ResultCode.ERROR)
                    .className(getClass().getName())
                    .methodName(Thread.currentThread().getStackTrace()[1].getMethodName())
                    .message("新增管理用户失败")
                    .params(user)
                    .build();
        }

    }

    /***
     * ***************************************
     * 功能描述:根据id查询用户信息
     * @param id
     * @return {@link DataResult}
     * @author create: TODO 人员:【ChangZiYang】类型:【新增方法】日期:【2021-01-27 10:55】
     * @author modify:
     */
    @ApiOperation(value = "根据id查询用户信息")
    @GetMapping("get/{id}")
    public DataResult get(@PathVariable String id) {
        try{
            return DataResult.builder()
                    .data("item",userService.getById(id))
                    .successBuild();
        }catch (Exception e){
            throw MyException.builder()
                    .exception(e)
                    .code(ResultCode.ERROR)
                    .className(getClass().getName())
                    .methodName(Thread.currentThread().getStackTrace()[1].getMethodName())
                    .message("根据id查询用户信息失败")
                    .params(id)
                    .build();
        }

    }

    /***
     * ***************************************
     * 功能描述:修改管理用户
     * @param user
     * @return {@link DataResult}
     * @author create: TODO 人员:【ChangZiYang】类型:【新增方法】日期:【2021-01-26 14:46】
     * @author modify:
     */
    @ApiOperation(value = "修改管理用户")
    @PutMapping("update")
    public DataResult updateById(@RequestBody User user) {
        try{
            userService.updateById(user);
            return DataResult.builder().successBuild();
        }catch (Exception e){
            throw MyException.builder()
                    .exception(e)
                    .code(ResultCode.ERROR)
                    .className(getClass().getName())
                    .methodName(Thread.currentThread().getStackTrace()[1].getMethodName())
                    .message("修改管理用户失败")
                    .params(user)
                    .build();
        }

    }

    /***
     * ***************************************
     * 功能描述:删除管理用户
     * @param id
     * @return {@link DataResult}
     * @author create: TODO 人员:【ChangZiYang】类型:【新增方法】日期:【2021-01-26 14:47】
     * @author modify:
     */
    @ApiOperation(value = "删除管理用户")
    @DeleteMapping("remove/{id}")
    public DataResult remove(@PathVariable String id) {
        try{
            userService.removeById(id);
            return DataResult.builder().successBuild();
        }catch (Exception e){
            throw MyException.builder()
                    .exception(e)
                    .code(ResultCode.ERROR)
                    .className(getClass().getName())
                    .methodName(Thread.currentThread().getStackTrace()[1].getMethodName())
                    .message("删除管理用户失败")
                    .params(id)
                    .build();
        }
    }

    /***
     * ***************************************
     * 功能描述:根据id列表删除管理用户
     * @param idList
     * @return {@link DataResult}
     * @author create: TODO 人员:【ChangZiYang】类型:【新增方法】日期:【2021-01-26 14:47】
     * @author modify:
     */
    @ApiOperation(value = "根据id列表删除管理用户")
    @DeleteMapping("batchRemove")
    public DataResult batchRemove(@RequestBody List<String> idList) {
        try{
            userService.removeByIds(idList);
            return DataResult.builder().successBuild();
        }catch (Exception e){
            throw MyException.builder()
                    .exception(e)
                    .code(ResultCode.ERROR)
                    .className(getClass().getName())
                    .methodName(Thread.currentThread().getStackTrace()[1].getMethodName())
                    .message("根据id列表删除管理用户失败")
                    .params(ArrayUtil.toString(idList))
                    .build();
        }
    }

    /***
     * ***************************************
     * 功能描述:根据用户获取角色数据
     * @param userId
     * @return {@link DataResult}
     * @author create: TODO 人员:【ChangZiYang】类型:【新增方法】日期:【2021-01-26 14:48】
     * @author modify:
     */
    @ApiOperation(value = "根据用户获取角色数据")
    @GetMapping("/toAssign/{userId}")
    public DataResult toAssign(@PathVariable String userId) {
        try{
            Map<String, Object> roleMap = roleService.findRoleByUserId(userId);
            return DataResult.builder()
                    .data(roleMap)
                    .successBuild();
        }catch (Exception e){
            throw MyException.builder()
                    .exception(e)
                    .code(ResultCode.ERROR)
                    .className(getClass().getName())
                    .methodName(Thread.currentThread().getStackTrace()[1].getMethodName())
                    .message("根据用户获取角色数据失败")
                    .params(userId)
                    .build();
        }
    }

    /***
     * ***************************************
     * 功能描述:根据用户分配角色
     * @param userId
     * @param roleId
     * @return {@link DataResult}
     * @author create: TODO 人员:【ChangZiYang】类型:【新增方法】日期:【2021-01-26 14:49】
     * @author modify:
     */
    @ApiOperation(value = "根据用户分配角色")
    @PostMapping("/doAssign")
    public DataResult doAssign(@RequestParam String userId,@RequestParam String[] roleId) {
        try{
            roleService.saveUserRoleRealtionShip(userId,roleId);
            return DataResult.builder().successBuild();
        }catch (Exception e){
            throw MyException.builder()
                    .exception(e)
                    .code(ResultCode.ERROR)
                    .className(getClass().getName())
                    .methodName(Thread.currentThread().getStackTrace()[1].getMethodName())
                    .message("根据用户分配角色失败")
                    .params(userId)
                    .build();
        }

    }
}

